trying to sort out input madness.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4570 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2013-12-19 18:41:57 +00:00
parent d4e312b398
commit 2a030268c5
2 changed files with 633 additions and 625 deletions

View file

@ -1,411 +1,410 @@
mergeInto(LibraryManager.library, mergeInto(LibraryManager.library,
{ {
//generic handles array //generic handles array
//yeah, I hope you don't use-after-free. hopefully that sort of thing will be detected on systems with easier non-mangled debuggers. //yeah, I hope you don't use-after-free. hopefully that sort of thing will be detected on systems with easier non-mangled debuggers.
$FTEH__deps: [], $FTEH__deps: [],
$FTEH: { $FTEH: {
h: [], h: [],
f: {} f: {}
}, },
$FTEC: $FTEC:
{ {
w: -1, w: -1,
h: -1, h: -1,
donecb:0, donecb:0,
evcb: { evcb: {
resize:0, resize:0,
mouse:0, mouse:0,
key:0, key:0,
}, },
handleevent : function(event) handleevent : function(event)
{ {
switch(event.type) switch(event.type)
{ {
case 'resize': case 'resize':
if (FTEC.evcb.resize != 0) if (FTEC.evcb.resize != 0)
Runtime.dynCall('vii', FTEC.evcb.resize, [Module['canvas'].width, Module['canvas'].height]); Runtime.dynCall('vii', FTEC.evcb.resize, [Module['canvas'].width, Module['canvas'].height]);
break; break;
case 'mousemove': case 'mousemove':
if (FTEC.evcb.mouse != 0) if (FTEC.evcb.mouse != 0)
{ {
if (Browser.pointerLock) if (Browser.pointerLock)
{ {
if (typeof event.movementX === 'undefined') if (typeof event.movementX === 'undefined')
{ {
event.movementX = event.mozMovementX; event.movementX = event.mozMovementX;
event.movementY = event.mozMovementY; event.movementY = event.mozMovementY;
} }
if (typeof event.movementX === 'undefined') if (typeof event.movementX === 'undefined')
{ {
event.movementX = event.webkitMovementX; event.movementX = event.webkitMovementX;
event.movementY = event.webkitMovementY; event.movementY = event.webkitMovementY;
} }
Runtime.dynCall('viiffff', FTEC.evcb.mouse, [0, false, event.movementX, event.movementY, 0, 0]); Runtime.dynCall('viiffff', FTEC.evcb.mouse, [0, false, event.movementX, event.movementY, 0, 0]);
} }
else else
Runtime.dynCall('viiffff', FTEC.evcb.mouse, [0, true, event.pageX, event.pageY, 0, 0]); Runtime.dynCall('viiffff', FTEC.evcb.mouse, [0, true, event.pageX, event.pageY, 0, 0]);
} }
break; break;
case 'mousedown': case 'mousedown':
case 'mouseup': case 'mouseup':
Browser.requestFullScreen(true, true); Browser.requestFullScreen(true, true);
Module['canvas'].requestPointerLock(); Module['canvas'].requestPointerLock();
if (FTEC.evcb.button != 0) if (FTEC.evcb.button != 0)
{ {
Runtime.dynCall('viii', FTEC.evcb.button, [0, event.type=='mousedown', event.button]); Runtime.dynCall('viii', FTEC.evcb.button, [0, event.type=='mousedown', event.button]);
event.preventDefault(); event.preventDefault();
} }
break; break;
case 'mousewheel': case 'mousewheel':
case 'wheel': case 'wheel':
if (FTEC.evcb.button != 0) if (FTEC.evcb.button != 0)
{ {
Runtime.dynCall('viii', FTEC.evcb.button, [0, 3, event.deltaY]); Runtime.dynCall('viii', FTEC.evcb.button, [0, 3, event.deltaY]);
event.preventDefault(); event.preventDefault();
} }
break; break;
case 'mouseout': case 'mouseout':
if (FTEC.evcb.button != 0) if (FTEC.evcb.button != 0)
{ {
for (var i = 0; i < 8; i++) for (var i = 0; i < 8; i++)
Runtime.dynCall('viii', FTEC.evcb.button, [0, false, i]); Runtime.dynCall('viii', FTEC.evcb.button, [0, false, i]);
} }
break; break;
case 'keypress': case 'keypress':
if (FTEC.evcb.key != 0) if (FTEC.evcb.key != 0)
{ {
Runtime.dynCall('viiii', FTEC.evcb.key, [0, 1, 0, event.charCode]); Runtime.dynCall('viiii', FTEC.evcb.key, [0, 1, 0, event.charCode]);
Runtime.dynCall('viiii', FTEC.evcb.key, [0, 0, 0, event.charCode]); Runtime.dynCall('viiii', FTEC.evcb.key, [0, 0, 0, event.charCode]);
event.preventDefault(); event.preventDefault();
} }
break; break;
case 'keydown': case 'keydown':
case 'keyup': case 'keyup':
//122 is 'toggle fullscreen'. //122 is 'toggle fullscreen'.
//we don't steal that because its impossible to leave it again once used. //we don't steal that because its impossible to leave it again once used.
if (FTEC.evcb.key != 0 && event.keyCode != 122) if (FTEC.evcb.key != 0 && event.keyCode != 122)
{ {
Runtime.dynCall('viiii', FTEC.evcb.key, [0, event.type=='keydown', event.keyCode, 0]); if (Runtime.dynCall('iiiii', FTEC.evcb.key, [0, event.type=='keydown', event.keyCode, 0]))
event.preventDefault(); event.preventDefault();
} }
break; break;
case 'keydown': default:
default: console.log(event);
console.log(event); }
} }
} },
}, emscriptenfte_setupcanvas__deps: ['$FTEC', '$Browser'],
emscriptenfte_setupcanvas__deps: ['$FTEC', '$Browser'], emscriptenfte_setupcanvas : function(nw,nh,evresz,evm,evb,evk)
emscriptenfte_setupcanvas : function(nw,nh,evresz,evm,evb,evk) {
{ FTEC.evcb.resize = evresz;
FTEC.evcb.resize = evresz; FTEC.evcb.mouse = evm;
FTEC.evcb.mouse = evm; FTEC.evcb.button = evb;
FTEC.evcb.button = evb; FTEC.evcb.key = evk;
FTEC.evcb.key = evk; if (!FTEC.donecb)
if (!FTEC.donecb) {
{ FTEC.donecb = 1;
FTEC.donecb = 1; ['mousedown', 'mouseup', 'mousemove', 'wheel', 'mousewheel', 'mouseout', 'keypress', 'keydown', 'keyup'].forEach(function(event)
['mousedown', 'mouseup', 'mousemove', 'wheel', 'mousewheel', 'mouseout', 'keydown', 'keyup'].forEach(function(event) {
{ Module['canvas'].addEventListener(event, FTEC.handleevent, true);
Module['canvas'].addEventListener(event, FTEC.handleevent, true); });
}); ['keydown', 'keyup', 'keypress'].forEach(function(event)
['keydown', 'keyup', 'keypress'].forEach(function(event) {
{ document.addEventListener(event, FTEC.handleevent, true);
document.addEventListener(event, FTEC.handleevent, true); });
});
Browser.resizeListeners.push(function(w, h) {
Browser.resizeListeners.push(function(w, h) { FTEC.handleevent({
FTEC.handleevent({ type: 'resize',
type: 'resize', });
}); });
}); }
} var ctx = Browser.createContext(Module['canvas'], true, true);
var ctx = Browser.createContext(Module['canvas'], true, true); if (!ctx)
if (!ctx) return 0;
return 0; Browser.setCanvasSize(nw, nh, false);
Browser.setCanvasSize(nw, nh, false);
window.onresize = function()
window.onresize = function() {
{ //emscripten's browser library will revert sizes wrongly or something when we're fullscreen, so make sure that doesn't happen.
//emscripten's browser library will revert sizes wrongly or something when we're fullscreen, so make sure that doesn't happen. if (Browser.isFullScreen)
if (Browser.isFullScreen) {
{ Browser.windowedWidth = window.innerWidth;
Browser.windowedWidth = window.innerWidth; Browser.windowedHeight = window.innerHeight;
Browser.windowedHeight = window.innerHeight; }
} else
else Browser.setCanvasSize(window.innerWidth, window.innerHeight, false);
Browser.setCanvasSize(window.innerWidth, window.innerHeight, false); };
}; window.onresize();
window.onresize();
return 1;
return 1; },
},
emscriptenfte_abortmainloop : function(msg)
emscriptenfte_abortmainloop : function(msg) {
{ msg = Pointer_stringify(msg);
msg = Pointer_stringify(msg); throw 'oh noes! something bad happened in ' + msg + '!';
throw 'oh noes! something bad happened in ' + msg + '!'; },
}, emscriptenfte_alert : function(msg)
emscriptenfte_alert : function(msg) {
{ msg = Pointer_stringify(msg);
msg = Pointer_stringify(msg); console.log(msg);
console.log(msg); alert(msg);
alert(msg); },
},
//FIXME: split+merge by \n
//FIXME: split+merge by \n emscriptenfte_print : function(msg)
emscriptenfte_print : function(msg) {
{ console.log(Pointer_stringify(msg));
console.log(Pointer_stringify(msg)); },
}, emscriptenfte_ticks_ms : function()
emscriptenfte_ticks_ms : function() {
{ return Date.now();
return Date.now(); },
},
emscriptenfte_handle_alloc__deps : ['$FTEH'],
emscriptenfte_handle_alloc__deps : ['$FTEH'], emscriptenfte_handle_alloc : function(h)
emscriptenfte_handle_alloc : function(h) {
{ for (var i = 0; FTEH.h.length; i+=1)
for (var i = 0; FTEH.h.length; i+=1) {
{ if (FTEH.h[i] == null)
if (FTEH.h[i] == null) {
{ FTEH.h[i] = h;
FTEH.h[i] = h; return i;
return i; }
} }
} i = FTEH.h.length;
i = FTEH.h.length; FTEH.h[i] = h;
FTEH.h[i] = h; return i;
return i; },
},
//temp files
//temp files emscriptenfte_buf_create__deps : ['emscriptenfte_handle_alloc'],
emscriptenfte_buf_create__deps : ['emscriptenfte_handle_alloc'], emscriptenfte_buf_create : function()
emscriptenfte_buf_create : function() {
{ var b = {h:-1, r:1, l:0,m:4096,d:new Uint8Array(4096), n:null};
var b = {h:-1, r:1, l:0,m:4096,d:new Uint8Array(4096), n:null}; b.h = _emscriptenfte_handle_alloc(b);
b.h = _emscriptenfte_handle_alloc(b); return b.h;
return b.h; },
}, //temp files
//temp files emscriptenfte_buf_open__deps : ['emscriptenfte_buf_create'],
emscriptenfte_buf_open__deps : ['emscriptenfte_buf_create'], emscriptenfte_buf_open : function(name, createifneeded)
emscriptenfte_buf_open : function(name, createifneeded) {
{ name = Pointer_stringify(name);
name = Pointer_stringify(name); var f = FTEH.f[name];
var f = FTEH.f[name]; var r = -1;
var r = -1; if (f == null)
if (f == null) {
{ if (createifneeded)
if (createifneeded) r = _emscriptenfte_buf_create();
r = _emscriptenfte_buf_create(); if (r != -1)
if (r != -1) {
{ f = FTEH.h[r];
f = FTEH.h[r]; f.r+=1;
f.r+=1; f.n = name;
f.n = name; FTEH.f[name] = f;
FTEH.f[name] = f; if (FTEH.f[name] != f || f.n != name)
if (FTEH.f[name] != f || f.n != name) console.log('error creating file '+name);
console.log('error creating file '+name); }
} }
} else
else {
{ f.r+=1;
f.r+=1; r = f.h;
r = f.h; }
} return r;
return r; },
}, emscriptenfte_buf_rename : function(oldname, newname)
emscriptenfte_buf_rename : function(oldname, newname) {
{ oldname = Pointer_stringify(oldname);
oldname = Pointer_stringify(oldname); newname = Pointer_stringify(newname);
newname = Pointer_stringify(newname); var f = FTEH.f[oldname];
var f = FTEH.f[oldname]; if (f == null)
if (f == null) return 0;
return 0; if (FTEH.f[newname] != null)
if (FTEH.f[newname] != null) return 0;
return 0; FTEH.f[newname] = f;
FTEH.f[newname] = f; delete FTEH.f[oldname];
delete FTEH.f[oldname]; f.n = newname;
f.n = newname; return 1;
return 1; },
}, emscriptenfte_buf_delete : function(name)
emscriptenfte_buf_delete : function(name) {
{ name = Pointer_stringify(name);
name = Pointer_stringify(name); var f = FTEH.f[name];
var f = FTEH.f[name]; if (f)
if (f) {
{ delete FTEH.f[name];
delete FTEH.f[name]; f.n = null;
f.n = null; emscriptenfte_buf_release(f.h);
emscriptenfte_buf_release(f.h); console.log('deleted '+name);
console.log('deleted '+name); return 1;
return 1; }
} return 0;
return 0; },
}, emscriptenfte_buf_release : function(handle)
emscriptenfte_buf_release : function(handle) {
{ var b = FTEH.h[handle];
var b = FTEH.h[handle]; if (b == null)
if (b == null) {
{ Module.printError('emscriptenfte_buf_release with invalid handle');
Module.printError('emscriptenfte_buf_release with invalid handle'); return;
return; }
} b.r -= 1;
b.r -= 1; if (b.r == 0)
if (b.r == 0) {
{ if (b.n != null)
if (b.n != null) delete FTEH.f[b.n];
delete FTEH.f[b.n]; delete FTEH.h[handle];
delete FTEH.h[handle]; b.d = null;
b.d = null; }
} },
}, emscriptenfte_buf_getsize : function(handle)
emscriptenfte_buf_getsize : function(handle) {
{ var b = FTEH.h[handle];
var b = FTEH.h[handle]; return b.l;
return b.l; },
}, emscriptenfte_buf_read : function(handle, offset, data, len)
emscriptenfte_buf_read : function(handle, offset, data, len) {
{ var b = FTEH.h[handle];
var b = FTEH.h[handle]; if (offset+len > b.l) //clamp the read
if (offset+len > b.l) //clamp the read len = b.l - offset;
len = b.l - offset; if (len < 0)
if (len < 0) {
{ len = 0;
len = 0; if (offset+len >= b.l)
if (offset+len >= b.l) return -1;
return -1; }
} HEAPU8.set(b.d.subarray(offset, offset+len), data);
HEAPU8.set(b.d.subarray(offset, offset+len), data); return len;
return len; },
}, emscriptenfte_buf_write : function(handle, offset, data, len)
emscriptenfte_buf_write : function(handle, offset, data, len) {
{ var b = FTEH.h[handle];
var b = FTEH.h[handle]; if (offset+len > b.m)
if (offset+len > b.m) { //extend it if needed.
{ //extend it if needed. b.m = offset + len + 4095;
b.m = offset + len + 4095; b.m = b.m & ~4095;
b.m = b.m & ~4095; var nd = new Uint8Array(b.m);
var nd = new Uint8Array(b.m); nd.set(b.d, 0);
nd.set(b.d, 0); b.d = nd;
b.d = nd; }
} if (len < 0)
if (len < 0) len = 0;
len = 0; console.log('deleted '+name);
console.log('deleted '+name); b.d.set(HEAPU8.subarray(data, data+len), offset);
b.d.set(HEAPU8.subarray(data, data+len), offset); if (offset + len > b.l)
if (offset + len > b.l) b.l = offset + len;
b.l = offset + len; return len;
return len; },
},
emscriptenfte_ws_connect__deps: ['emscriptenfte_handle_alloc'],
emscriptenfte_ws_connect__deps: ['emscriptenfte_handle_alloc'], emscriptenfte_ws_connect : function(url)
emscriptenfte_ws_connect : function(url) {
{ var _url = Pointer_stringify(url);
var _url = Pointer_stringify(url); var s = {ws:null, inq:[], err:0};
var s = {ws:null, inq:[], err:0}; s.ws = new WebSocket(_url, 'binary');
s.ws = new WebSocket(_url, 'binary'); if (!s.ws)
if (!s.ws) return -1;
return -1; s.ws.onerror = function(event) {s.err = 1;};
s.ws.onerror = function(event) {s.err = 1;}; s.ws.onclose = function(event) {s.err = 1;};
s.ws.onclose = function(event) {s.err = 1;}; // s.ws.onopen = function(event) {};
// s.ws.onopen = function(event) {}; s.ws.onmessage = function(event)
s.ws.onmessage = function(event) {
{ assert(typeof event.data !== 'string' && event.data.byteLength);
assert(typeof event.data !== 'string' && event.data.byteLength); s.inq.push(new Uint8Array(event.data));
s.inq.push(new Uint8Array(event.data)); };
};
return _emscriptenfte_handle_alloc(s);
return _emscriptenfte_handle_alloc(s); },
}, emscriptenfte_ws_close : function(sockid)
emscriptenfte_ws_close : function(sockid) {
{ var s = FTEH.h[sockid];
var s = FTEH.h[sockid]; if (!s)
if (!s) return -1;
return -1; s.ws.close();
s.ws.close(); s.ws = null; //make sure to avoid circular references
s.ws = null; //make sure to avoid circular references delete FTEH.h[sockid]; //socked is no longer accessible.
delete FTEH.h[sockid]; //socked is no longer accessible. return 0;
return 0; },
}, //separate call allows for more sane flood control when fragmentation is involved.
//separate call allows for more sane flood control when fragmentation is involved. emscriptenfte_ws_cansend : function(sockid, extra, maxpending)
emscriptenfte_ws_cansend : function(sockid, extra, maxpending) {
{ var s = FTEH.h[sockid];
var s = FTEH.h[sockid]; if (!s)
if (!s) return 1; //go on punk, make my day.
return 1; //go on punk, make my day. return ((s.ws.bufferedAmount+extra) < maxpending);
return ((s.ws.bufferedAmount+extra) < maxpending); },
}, emscriptenfte_ws_send : function(sockid, data, len)
emscriptenfte_ws_send : function(sockid, data, len) {
{ var s = FTEH.h[sockid];
var s = FTEH.h[sockid]; if (!s)
if (!s) return -1;
return -1; s.s.send(HEAPU8.subarray(data, data+len).buffer);
s.s.send(HEAPU8.subarray(data, data+len).buffer); return len;
return len; },
}, emscriptenfte_ws_recv : function(sockid, data, len)
emscriptenfte_ws_recv : function(sockid, data, len) {
{ var s = FTEH.h[sockid];
var s = FTEH.h[sockid]; if (!s)
if (!s) return -1;
return -1; var inp = s.inq.shift();
var inp = s.inq.shift(); if (inp)
if (inp) {
{ if (inp.length > len)
if (inp.length > len) inp.length = len;
inp.length = len; HEAPU8.set(inp, data);
HEAPU8.set(inp, data); return inp.length;
return inp.length; }
} if (s.err)
if (s.err) return 0;
return 0; return -1;
return -1; },
},
emscriptenfte_async_wget_data2 : function(url, ctx, onload, onerror, onprogress)
emscriptenfte_async_wget_data2 : function(url, ctx, onload, onerror, onprogress) {
{ var _url = Pointer_stringify(url);
var _url = Pointer_stringify(url); console.log("Attempting download of " + _url);
console.log("Attempting download of " + _url); var http = new XMLHttpRequest();
var http = new XMLHttpRequest(); http.open('GET', _url, true);
http.open('GET', _url, true); http.responseType = 'arraybuffer';
http.responseType = 'arraybuffer';
http.onload = function(e)
http.onload = function(e) {
{ console.log("onload: " + _url + " status " + http.status);
console.log("onload: " + _url + " status " + http.status); if (http.status == 200)
if (http.status == 200) {
{ var bar = new Uint8Array(http.response);
var bar = new Uint8Array(http.response); var buf = _malloc(bar.length);
var buf = _malloc(bar.length); HEAPU8.set(bar, buf);
HEAPU8.set(bar, buf); if (onload)
if (onload) Runtime.dynCall('viii', onload, [ctx, buf, bar.length]);
Runtime.dynCall('viii', onload, [ctx, buf, bar.length]); }
} else
else {
{ if (onerror)
if (onerror) Runtime.dynCall('vii', onerror, [ctx, http.status]);
Runtime.dynCall('vii', onerror, [ctx, http.status]); }
} };
};
http.onerror = function(e)
http.onerror = function(e) {
{ console.log("onerror: " + _url + " status " + http.status);
console.log("onerror: " + _url + " status " + http.status); if (onerror)
if (onerror) Runtime.dynCall('vii', onerror, [ctx, http.status]);
Runtime.dynCall('vii', onerror, [ctx, http.status]); };
};
http.onprogress = function(e)
http.onprogress = function(e) {
{ if (onprogress)
if (onprogress) Runtime.dynCall('viii', onprogress, [ctx, e.loaded, e.total]);
Runtime.dynCall('viii', onprogress, [ctx, e.loaded, e.total]); };
};
http.send(null);
http.send(null); }
} });
});

View file

@ -1,214 +1,223 @@
#include "quakedef.h" #include "quakedef.h"
#include "glquake.h" #include "glquake.h"
#include "web/ftejslib.h" #include "web/ftejslib.h"
extern cvar_t vid_hardwaregamma; extern cvar_t vid_hardwaregamma;
extern cvar_t gl_lateswap; extern cvar_t gl_lateswap;
extern int gammaworks; extern int gammaworks;
extern qboolean vid_isfullscreen; extern qboolean vid_isfullscreen;
qboolean ActiveApp; qboolean ActiveApp;
qboolean mouseactive; qboolean mouseactive;
extern qboolean mouseusedforgui; extern qboolean mouseusedforgui;
static void *GLVID_getsdlglfunction(char *functionname) static void *GLVID_getsdlglfunction(char *functionname)
{ {
return NULL; return NULL;
} }
static void VID_Resized(int width, int height) static void VID_Resized(int width, int height)
{ {
extern cvar_t vid_conautoscale, vid_conwidth; extern cvar_t vid_conautoscale, vid_conwidth;
vid.pixelwidth = width; vid.pixelwidth = width;
vid.pixelheight = height; vid.pixelheight = height;
//Con_Printf("Resized: %i %i\n", vid.pixelwidth, vid.pixelheight); //Con_Printf("Resized: %i %i\n", vid.pixelwidth, vid.pixelheight);
Cvar_ForceCallback(&vid_conautoscale); Cvar_ForceCallback(&vid_conautoscale);
Cvar_ForceCallback(&vid_conwidth); Cvar_ForceCallback(&vid_conwidth);
} }
static unsigned int domkeytoquake(unsigned int code) static unsigned int domkeytoquake(unsigned int code)
{ {
unsigned int tab[256] = unsigned int tab[256] =
{ {
/* 0*/ 0,0,0,0,0,0,0,0, K_BACKSPACE,K_TAB,0,0,0,K_ENTER,0,0, /* 0*/ 0,0,0,0,0,0,0,0, K_BACKSPACE,K_TAB,0,0,0,K_ENTER,0,0,
/* 16*/ K_SHIFT,K_CTRL,K_ALT,K_PAUSE,K_CAPSLOCK,0,0,0,0,0,0,K_ESCAPE,0,0,0,0, /* 16*/ K_SHIFT,K_CTRL,K_ALT,K_PAUSE,K_CAPSLOCK,0,0,0,0,0,0,K_ESCAPE,0,0,0,0,
/* 32*/ ' ',K_PGUP,K_PGDN,K_END,K_HOME,K_LEFTARROW,K_UPARROW,K_RIGHTARROW, K_DOWNARROW,0,0,0,K_PRINTSCREEN,K_INS,K_DEL,0, /* 32*/ ' ',K_PGUP,K_PGDN,K_END,K_HOME,K_LEFTARROW,K_UPARROW,K_RIGHTARROW, K_DOWNARROW,0,0,0,K_PRINTSCREEN,K_INS,K_DEL,0,
/* 48*/ '0','1','2','3','4','5','6','7', '8','9',0,0,0,0,0,0, /* 48*/ '0','1','2','3','4','5','6','7', '8','9',0,0,0,0,0,0,
/* 64*/ 0,'a','b','c','d','e','f','g', 'h','i','j','k','l','m','n','o', /* 64*/ 0,'a','b','c','d','e','f','g', 'h','i','j','k','l','m','n','o',
/* 80*/ 'p','q','r','s','t','u','v','w', 'x','y','z',K_LWIN,K_RWIN,K_APP,0,0, /* 80*/ 'p','q','r','s','t','u','v','w', 'x','y','z',K_LWIN,K_RWIN,K_APP,0,0,
/* 96*/ K_KP_INS,K_KP_END,K_KP_DOWNARROW,K_KP_PGDN,K_KP_LEFTARROW,K_KP_5,K_KP_RIGHTARROW,K_KP_HOME, K_KP_UPARROW,K_KP_PGDN,K_KP_STAR,K_KP_PLUS,0,K_KP_MINUS,K_KP_DEL,K_KP_SLASH, /* 96*/ K_KP_INS,K_KP_END,K_KP_DOWNARROW,K_KP_PGDN,K_KP_LEFTARROW,K_KP_5,K_KP_RIGHTARROW,K_KP_HOME, K_KP_UPARROW,K_KP_PGDN,K_KP_STAR,K_KP_PLUS,0,K_KP_MINUS,K_KP_DEL,K_KP_SLASH,
/*112*/ K_F1,K_F2,K_F3,K_F4,K_F5,K_F6,K_F7,K_F8,K_F9,K_F10,K_F11,K_F12,0,0,0,0, /*112*/ K_F1,K_F2,K_F3,K_F4,K_F5,K_F6,K_F7,K_F8,K_F9,K_F10,K_F11,K_F12,0,0,0,0,
/*128*/ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, /*128*/ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
/*144*/ K_KP_NUMLOCK,K_SCRLCK,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, /*144*/ K_KP_NUMLOCK,K_SCRLCK,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
/*160*/ 0,0,0,'#',0,0,0,0, 0,0,0,0,0,0,0,0, /*160*/ 0,0,0,'#',0,0,0,0, 0,0,0,0,0,0,0,0,
/*176*/ 0,0,0,0,0,0,0,0, 0,0,';','=',',','-','.','/', /*176*/ 0,0,0,0,0,0,0,0, 0,0,';','=',',','-','.','/',
/*192*/ '`',0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, /*192*/ '`',0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
/*208*/ 0,0,0,0,0,0,0,0, 0,0,0,'[','\\',']','\'','`', /*208*/ 0,0,0,0,0,0,0,0, 0,0,0,'[','\\',']','\'','`',
/*224*/ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, /*224*/ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
/*240*/ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, /*240*/ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
}; };
if (!code) if (!code)
return 0; return 0;
if (code >= sizeof(tab)/sizeof(tab[0])) if (code >= sizeof(tab)/sizeof(tab[0]))
{ {
Con_DPrintf("You just pressed key %u, but I don't know what its meant to be\n", code); Con_DPrintf("You just pressed key %u, but I don't know what its meant to be\n", code);
return 0; return 0;
} }
if (!tab[code]) if (!tab[code])
Con_DPrintf("You just pressed key %u, but I don't know what its meant to be\n", code); Con_DPrintf("You just pressed key %u, but I don't know what its meant to be\n", code);
Con_DPrintf("You just pressed dom key %u, which is quake key %u\n", code, tab[code]); Con_DPrintf("You just pressed dom key %u, which is quake key %u\n", code, tab[code]);
return tab[code]; return tab[code];
} }
static void DOM_KeyEvent(int devid, int down, int scan, int uni) static int DOM_KeyEvent(int devid, int down, int scan, int uni)
{ {
IN_KeyEvent(0, down, domkeytoquake(scan), uni); IN_KeyEvent(0, down, domkeytoquake(scan), uni);
} //Chars which don't map to some printable ascii value get preventDefaulted.
static void DOM_ButtonEvent(int devid, int down, int button) //This is to stop fucking annoying fucking things like backspace randomly destroying the page and thus game.
{ //And it has to be conditional, or we don't get any unicode chars at all.
if (down == 2) //The behaviour browsers seem to give is retardedly unhelpful, and just results in hacks to detect keys that appear to map to ascii...
{ //Preventing the browser from leaving the page etc should NOT mean I can no longer get ascii/unicode values, only that the browser stops trying to do something random due to the event.
//fixme: the event is a float. we ignore that. //If you are the person that decreed that this is the holy way, then please castrate yourself now.
while(button < 0) if (scan < ' ' || scan >= 127)
{ return TRUE;
IN_KeyEvent(0, true, K_MWHEELUP, 0); return FALSE;
button += 1; }
} static void DOM_ButtonEvent(int devid, int down, int button)
while(button > 0) {
{ if (down == 2)
IN_KeyEvent(0, true, K_MWHEELDOWN, 0); {
button -= 1; //fixme: the event is a float. we ignore that.
} while(button < 0)
} {
else IN_KeyEvent(0, true, K_MWHEELUP, 0);
{ button += 1;
//swap buttons 2 and 3, so rmb is still +forward by default and not +mlook. }
if (button == 2) while(button > 0)
button = 1; {
else if (button == 1) IN_KeyEvent(0, true, K_MWHEELDOWN, 0);
button = 2; button -= 1;
}
IN_KeyEvent(0, down, K_MOUSE1+button, 0); }
} else
} {
//swap buttons 2 and 3, so rmb is still +forward by default and not +mlook.
qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette) if (button == 2)
{ button = 1;
int flags; else if (button == 1)
button = 2;
vid_isfullscreen = true;
IN_KeyEvent(0, down, K_MOUSE1+button, 0);
if (!emscriptenfte_setupcanvas( }
info->width, }
info->height,
VID_Resized, qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette)
IN_MouseMove, {
DOM_ButtonEvent, int flags;
DOM_KeyEvent
)) vid_isfullscreen = true;
{
Con_Printf("Couldn't set up canvas\n"); if (!emscriptenfte_setupcanvas(
return false; info->width,
} info->height,
VID_Resized,
ActiveApp = true; IN_MouseMove,
DOM_ButtonEvent,
GL_Init(GLVID_getsdlglfunction); DOM_KeyEvent
))
qglViewport (0, 0, vid.pixelwidth, vid.pixelheight); {
Con_Printf("Couldn't set up canvas\n");
mouseactive = false; return false;
}
return true;
} ActiveApp = true;
void GLVID_DeInit (void) GL_Init(GLVID_getsdlglfunction);
{
ActiveApp = false; qglViewport (0, 0, vid.pixelwidth, vid.pixelheight);
emscriptenfte_setupcanvas(-1, -1, NULL, NULL, NULL, NULL); mouseactive = false;
}
return true;
}
void GL_BeginRendering (void)
{ void GLVID_DeInit (void)
} {
ActiveApp = false;
qboolean screenflush;
void GL_DoSwap (void) emscriptenfte_setupcanvas(-1, -1, NULL, NULL, NULL, NULL);
{ }
if (!screenflush)
return;
screenflush = 0; void GL_BeginRendering (void)
{
//webgl doesn't support swapbuffers. }
//you can't use it for loading screens.
//such things must result in waiting until the following frame. qboolean screenflush;
//although there IS a swapped-buffers event, which we should probably use in preference to requestanimationframe or whatever the call is. void GL_DoSwap (void)
{
/* if (!screenflush)
if (!vid_isfullscreen) return;
{ screenflush = 0;
if (!_windowed_mouse.value)
{ //webgl doesn't support swapbuffers.
if (mouseactive) //you can't use it for loading screens.
{ //such things must result in waiting until the following frame.
IN_DeactivateMouse (); //although there IS a swapped-buffers event, which we should probably use in preference to requestanimationframe or whatever the call is.
}
} /*
else if (!vid_isfullscreen)
{ {
if ((key_dest == key_game||mouseusedforgui) && ActiveApp) if (!_windowed_mouse.value)
IN_ActivateMouse (); {
else if (!(key_dest == key_game || mouseusedforgui) || !ActiveApp) if (mouseactive)
IN_DeactivateMouse (); {
} IN_DeactivateMouse ();
} }
*/ }
} else
{
void GL_EndRendering (void) if ((key_dest == key_game||mouseusedforgui) && ActiveApp)
{ IN_ActivateMouse ();
screenflush = true; else if (!(key_dest == key_game || mouseusedforgui) || !ActiveApp)
if (!gl_lateswap.value) IN_DeactivateMouse ();
GL_DoSwap(); }
} }
*/
qboolean GLVID_ApplyGammaRamps (unsigned short *ramps) }
{
gammaworks = false; void GL_EndRendering (void)
return gammaworks; {
} screenflush = true;
if (!gl_lateswap.value)
void GLVID_SetCaption(char *text) GL_DoSwap();
{ }
// SDL_WM_SetCaption( text, NULL );
} qboolean GLVID_ApplyGammaRamps (unsigned short *ramps)
{
void Sys_SendKeyEvents(void) gammaworks = false;
{ return gammaworks;
/*callbacks happen outside our code, we don't need to poll for events*/ }
}
/*various stuff for joysticks, which we don't support in this port*/ void GLVID_SetCaption(char *text)
void INS_Shutdown (void) {
{ // SDL_WM_SetCaption( text, NULL );
} }
void INS_ReInit (void)
{ void Sys_SendKeyEvents(void)
} {
void INS_Move(float *movements, int pnum) /*callbacks happen outside our code, we don't need to poll for events*/
{ }
} /*various stuff for joysticks, which we don't support in this port*/
void INS_Init (void) void INS_Shutdown (void)
{ {
} }
void INS_Accumulate(void) void INS_ReInit (void)
{ {
} }
void INS_Commands (void) void INS_Move(float *movements, int pnum)
{ {
} }
void INS_Init (void)
{
}
void INS_Accumulate(void)
{
}
void INS_Commands (void)
{
}